package org.demo.system.service.impl;

import org.demo.base.auth.domain.Permission;
import org.demo.base.auth.domain.Role;
import org.demo.base.auth.domain.SysUser;
import org.demo.system.service.AuthService;
import org.demo.system.service.RoleService;
import org.demo.system.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import java.util.HashSet;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * 认证服务
 * @author tomdog
 */
@Service
public class AuthServiceImpl implements AuthService {

    @Autowired
    private UserService userService;// 通常不会跨业务调用mapper，这里只能引入service
    @Autowired
    private RoleService roleService;

    /**
     * 使用账号密码登录
     */
    @Override
    public SysUser login(SysUser user) {
        // 用手机号查询用户
        SysUser target = userService.getUserByMobile(user.getMobile());
        if(target==null) {
            throw new RuntimeException("手机号未注册");
        }
        // 密码对比
        if(!target.getPassword().equals(user.getPassword())) {
            throw new RuntimeException("密码错误");
        }
        // 查询角色，角色中包含有权限
        List<Role> roles = roleService.listByUserId(target.getId());
        target.setRoles(roles);// 设置角色
        // 把角色的权限拆解出来，方便后续使用
        if(!CollectionUtils.isEmpty(roles)) {
            Set<String> permissionKeys = new HashSet<>();
            // 遍历角色进行拆解
            roles.stream().map(Role::getPermissions)// 取出每个角色的权限列表
                    .filter(Objects::nonNull)// 只要其中不为空的列表
                    .forEach(// 最后将这些列表的key取出来，全部放到permissionKeys中
                        list -> permissionKeys.addAll(list.stream().map(Permission::getPermissionKey).collect(Collectors.toSet()))
                    );
            target.setPermissions(permissionKeys);
        }
        return target;
    }
}
